﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DTO;
using System.Data;
using MySql.Data;
using MySql.Data.MySqlClient;

namespace Persistence
{
    public class AdministratorController : PersonController
    {
        //Inserta un nuevo administrador.
        public static long insertAdmin(Administrator admin) {
            //Se le envia al metodo insertPerson como parametro, la instancia de Persona
            //y el nombre del procedimiento almacenado que se desea usar.
            MySqlCommand comm = insertPerson(admin, "proin_AT");

            MySqlParameter outIdParam = new MySqlParameter("@vId", MySqlDbType.Int16)
            {
                Direction = ParameterDirection.Output
            };
            comm.Parameters.AddWithValue("@pusername", truncate(admin.StrUserName, 40));
            comm.Parameters.AddWithValue("@ppassword", truncate(admin.StrPassword, 40));
            comm.Parameters.AddWithValue("@pusertype", "Administrator");
            comm.Parameters.Add(outIdParam);

            //Se ejecuta el comando.
            DBConnection.getInstance().executeNonQueryCommand(comm);
            //Se devuelve el Id del administrador creado.
            long id = long.Parse(outIdParam.Value.ToString());

            return id;
        }
        //Actualiza los datos de un administrador.
        public static void updateAdministrator(Administrator pUpdated)
        {

            //Se obtiene la version antigua de los datos del docente a actualizar.
            Administrator pOriginal = getAdministratorById(pUpdated.LngId);
            //Se actualizan los datos generales.
            updatePerson(pOriginal, pUpdated);

            //Se actualizan los datos especificos de la clase Administrator.
            if (!pUpdated.StrUserName.Equals(pOriginal.StrUserName))
            {
                Helper.updateProperty("users", "ususername", pUpdated.StrUserName, "usid", pOriginal.LngId, 40);
            }
            if (pUpdated.StrPassword != null && !pUpdated.StrPassword.Equals(pOriginal.StrPassword))
            {
                Helper.updateProperty("users", "uspassword", pUpdated.StrPassword, "usid", pOriginal.LngId, 40);
            }
        }

        //Da baja logica a un administrador en el sistema.
        public static void deleteAdministrator(long vId)
        {
            deletePerson(vId, "Administrator");
        }

        //Obtiene una lista de los administradores registrados y activos coincidentes con el criterio de busqueda.
        public static DataTable getAdminListBySearch(string vSearch)
        {
            DBConnection dbConn = DBConnection.getInstance();
            MySqlCommand cmd = dbConn.createCommand();
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = "proout_ListAT";
            cmd.Parameters.AddWithValue("@ptypeuser", "Administrator");
            cmd.Parameters.AddWithValue("@psearch", vSearch);

            DataTable dt = dbConn.executeSelectCommand(cmd);
            return dt;
        }

        //Obtiene una instancia de Administrator con los datos correspondientes al Id ingresado como parametro.
        public static Administrator getAdministratorById(long vId)
        {
            //Se obtienen los datos generales del administrador.
            Administrator adm = new Administrator();
            adm = (Administrator)PersonController.getPersonById(vId, adm);

            //Se obtienen los datos especificos de la clase Administrator.
            string sql = "SELECT ususername, uspassword FROM  users WHERE usid = @id;";
            MySqlCommand comm = DBConnection.getInstance().createCommand();
            comm.CommandText = sql;
            comm.Parameters.AddWithValue("id", Convert.ToInt16(vId));
            DataTable dt = DBConnection.getInstance().executeSelectCommand(comm);
            //Se asignan los datos obtenidos a la instancia de Administrator creada.
            adm.StrUserName = dt.Rows[0]["ususername"].ToString();
            adm.StrPassword = dt.Rows[0]["uspassword"].ToString();
            //Se retorna el docente.
            return adm;
        }
        private static string truncate(string unSt, int maxLength)
        {
            return unSt.Length <= maxLength ? unSt : unSt.Substring(0, maxLength);
        } 
    }
}
